import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;

public class RedisZSet {
    public static void test1(Jedis jedis) {
        System.out.println("zadd zcard zcount");
        jedis.flushAll();

        jedis.zadd("key1", 10, "111");
        jedis.zadd("key1", 50, "222");
        jedis.zadd("key1", 20, "333");
        jedis.zadd("key1", 70, "444");
        jedis.zadd("key1", 60, "555");
        jedis.zadd("key1", 90, "666");

        // 获取ZSet 中的对应的元素个数
        long key1 = jedis.zcard("key1");
        System.out.println(key1);

        // 获取这个min和max区间内的所有元素的个数进行统计
        long key11 = jedis.zcount("key1", 20, 70);
        System.out.println(key11);
    }

    public static void test2(Jedis jedis) {
        System.out.println("zrange  zrevrange zrangeByScore");
        jedis.flushAll();

        jedis.zadd("key1", 10, "111");
        jedis.zadd("key1", 50, "222");
        jedis.zadd("key1", 20, "333");
        jedis.zadd("key1", 70, "444");
        jedis.zadd("key1", 60, "555");
        jedis.zadd("key1", 90, "666");

        // 返回key中的区间内的所有元素，并按照分数的升序进行排序
        List<String> key1 = jedis.zrange("key1", 0, -1);
        System.out.println(key1);

        // 返回key中的区间内的所有元素，并按照分数的降序进行排序
        List<String> key11 = jedis.zrevrange("key1", 0, -1);
        System.out.println(key11);

        // 返回key中的区间内的所有元素，并按照分数进行查找
        List<String> key12 = jedis.zrangeByScore("key1", 0, -1);
    }

    public static void test3(Jedis jedis) {
        System.out.println("zpopmax  zpopmin  bzpopmax  bzpopmin");
        jedis.flushAll();

        jedis.zadd("key1", 10, "111");
        jedis.zadd("key1", 50, "222");
        jedis.zadd("key1", 20, "333");
        jedis.zadd("key1", 70, "444");
        jedis.zadd("key1", 60, "555");
        jedis.zadd("key1", 90, "666");

        // 删除key中的最大值，按照分数进行删除
        jedis.zpopmax("key1");
        List<String> key1 = jedis.zrange("key1", 0, -1);
        System.out.println(key1);

        // 阻塞删除key中的最大值，按照分数进行删除
        jedis.bzpopmax(2, "key1");
        List<String> key2 = jedis.zrange("key1", 0, -1);
        System.out.println(key2);

        // 删除key中的最小值，按照分数进行删除
        jedis.zpopmin("key1");
        List<String> key3 = jedis.zrange("key1", 0, -1);
        System.out.println(key3);

        // 阻塞删除key中的最小值，按照分数进行删除
        jedis.bzpopmin(2, "key1");
        List<String> key4 = jedis.zrange("key1", 0, -1);
        System.out.println(key4);
    }

    public static void test4(Jedis jedis) {
        System.out.println("zrank  zrevrank zscore zrem");
        jedis.flushAll();

        jedis.zadd("key1", 10, "111");
        jedis.zadd("key1", 50, "222");
        jedis.zadd("key1", 20, "333");
        jedis.zadd("key1", 70, "444");
        jedis.zadd("key1", 60, "555");
        jedis.zadd("key1", 90, "666");

        // 返回指定元素的排名，升序
        Long key1 = jedis.zrank("key1", "444");
        System.out.println(key1);

        // 返回指定元素的排名，降序
        Long key2 = jedis.zrevrank("key1", "555");
        System.out.println(key2);

        // 返回指定元素的分数
        Double key3 = jedis.zscore("key1", "111");
        System.out.println(key3);

        // 删除指定元素，可以指定多个
        jedis.zrem("key1", "666");
        List<String> key4 = jedis.zrange("key1", 0, -1);
        System.out.println(key4);
    }

    public static void test5(Jedis jedis) {
        System.out.println("zremrangeByRank  zremrangeByScore");
        jedis.flushAll();

        jedis.zadd("key1", 10, "111");
        jedis.zadd("key1", 50, "222");
        jedis.zadd("key1", 20, "333");
        jedis.zadd("key1", 70, "444");
        jedis.zadd("key1", 60, "555");
        jedis.zadd("key1", 90, "666");

        // 删除区间内的所有元素，按照下标，闭区间
        jedis.zremrangeByRank("key1", 2, 4);
        List<String> key1 = jedis.zrange("key1", 0, -1);
        System.out.println(key1);

        jedis.zadd("key2", 10, "111");
        jedis.zadd("key2", 50, "222");
        jedis.zadd("key2", 20, "333");
        jedis.zadd("key2", 70, "444");
        jedis.zadd("key2", 60, "555");
        jedis.zadd("key2", 90, "666");

        // 删除区间内的所有元素，按照分数，闭区间
        jedis.zremrangeByScore("key2", 40, 60);
        List<String> key2 = jedis.zrange("key2", 0, -1);
        System.out.println(key2);
    }

    public static void test6(Jedis jedis) {
        System.out.println("zincrby");
        jedis.flushAll();

        jedis.zadd("key1", 10, "111");
        jedis.zadd("key1", 50, "222");
        jedis.zadd("key1", 20, "333");
        jedis.zadd("key1", 70, "444");
        jedis.zadd("key1", 60, "555");
        jedis.zadd("key1", 90, "666");

        // 指定某个元素的分数进行+上指定的分数，可以为负数
        jedis.zincrby("key1", 20, "444");
        List<String> key1 = jedis.zrange("key1", 0, -1);
        System.out.println(key1);
    }

    public static void main(String[] args) {
        JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");

        try (Jedis jedis =  jedisPool.getResource()) {
//            test1(jedis);
//            test2(jedis);
//            test3(jedis);
//            test4(jedis);
//            test5(jedis);
//            test6(jedis);
        }
    }
}
